home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (C) 1990-1992 Michael Davidson.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software
- * and its documentation for any purpose and without fee is hereby
- * granted, provided that the above copyright notice appear in all
- * copies and that both that copyright notice and this permission
- * notice appear in supporting documentation.
- *
- * This software is provided "as is" without express or implied warranty.
- */
-
- /*
- * vesabios.c - interface to VESA video bios functions
- */
- #include <unistd.h>
-
- #include "v86mode.h"
- #include "vbios.h"
- #include "vesabios.h"
-
- int
- VESAVersion()
- {
- register struct tss386 *t = v86tss;
- VESAInfo *p;
-
- AX(t) = VESA_INFO;
- ES(t) = VBIOS_SEG;
- DI(t) = 0x1000;
-
- VBiosINT10();
-
- if (AX(t) != VESA_RETURN_OK)
- return -1;
-
- p = (VESAInfo *)( (VBIOS_SEG << 4) + 0x1000 );
-
- return p->version;
- }
-
- char *
- VESAVendorData()
- {
- register struct tss386 *t = v86tss;
- VESAInfo *p;
-
- AX(t) = VESA_INFO;
- ES(t) = VBIOS_SEG;
- DI(t) = 0x1000;
-
- VBiosINT10();
-
- if (AX(t) != VESA_RETURN_OK)
- return NULL;
-
- p = (VESAInfo *)( (VBIOS_SEG << 4) + 0x1000 );
-
- return (char *) ((SEGMENT(p->vendor_data) << 4) + OFFSET(p->vendor_data));
- }
-
- unsigned short *
- VESAModeTable()
- {
- register struct tss386 *t = v86tss;
- VESAInfo *p;
-
- AX(t) = VESA_INFO;
- ES(t) = VBIOS_SEG;
- DI(t) = 0x1000;
-
- VBiosINT10();
-
- if (AX(t) != VESA_RETURN_OK)
- return NULL;
-
- p = (VESAInfo *)( (VBIOS_SEG << 4) + 0x1000 );
-
- return (unsigned short *) ((SEGMENT(p->mode_table) << 4) + OFFSET(p->mode_table));
- }
-
- #if 0
- int
- VESAMemorySize()
- {
- return 0;
- }
- #endif
-
- VESAModeInfo *
- VESABiosGetModeInfo(
- unsigned short mode
- )
- {
- register struct tss386 *t = v86tss;
-
- AX(t) = VESA_MODE_INFO;
- CX(t) = mode;
- ES(t) = VBIOS_SEG;
- DI(t) = 0x2000;
-
- VBiosINT10();
-
- if (AX(t) != VESA_RETURN_OK)
- return NULL;
-
- return (VESAModeInfo *) ((VBIOS_SEG << 4) + 0x2000);
- }
-
- int
- VESABiosSetMode(
- int mode
- )
- {
- register struct tss386 *t = v86tss;
- int r;
-
- if (mode >= 0x100)
- {
- AX(t) = VESA_SET_MODE;
- BX(t) = (word_t) mode;
- VBiosINT10();
- r = (AX(t) == VESA_RETURN_OK) ? 0 : -1;
- }
- else
- {
- AH(t) = 0;
- AL(t) = (byte_t) mode;
- VBiosINT10();
- AH(t) = 0x0f;
- VBiosINT10();
- r = ((AL(t) & 0x7f) == (mode & 0x7f)) ? 0 : -1;
- }
-
- return r;
- }
-
- int
- VESABiosGetMode()
- {
- register struct tss386 *t = v86tss;
-
- AH(t) = 0x0f;
-
- VBiosINT10();
-
- return AL(t);
- }
-
- int
- VESABiosBankSwitch(
- unsigned short bank
- )
- {
- register struct tss386 *t = v86tss;
-
- AX(t) = VESA_WINDOW_CONTROL;
- BX(t) = 0;
- DX(t) = bank;
-
- VBiosINT10();
-
- return 0;
- }
-
- int
- VESABiosGetDisplayStart(
- int *x,
- int *y
- )
- {
- register struct tss386 *t = v86tss;
-
- AX(t) = VESA_DISPLAY_START;
- BX(t) = 0x01;
-
- VBiosINT10();
-
- if (AX(t) == VESA_RETURN_OK)
- {
- *x = CX(t);
- *y = DX(t);
- return 0;
- }
- return -1;
- }
-